'use strict';

var f = function (x) {
    return x * x;
};

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
//console.log(arr.map(f));

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
//console.log(arr.map(String));

arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
    return x + y;
}); 

arr.reduce(function(x,y) {
    return x*y;
});

//利用map和reduce操作实现一个string2int()函数
var a = '12345';

var result = function string2int(s) {
    var arr=[];
    for(var i in s) {
        arr[i]=s[i];
    }
    var s2num = arr.map(x => x - 0);
    return s2num.reduce((x,y) => (x*10 + y));
};

//console.log(result(a));

//输入：['adam', 'LISA', 'barT']，输出：['Adam', 'Lisa', 'Bart']。
function normalize(arr) {
    return arr.map(x => (x[0].toUpperCase() + x.substring(1).toLowerCase()));
}
//console.log(normalize(['adam', 'LISA', 'barT']).toString());

//map()把字符串变成整数  var arr = ['1', '2', '3'];
function getResult(arr) {
    return arr.map(x => (x - 0)).reduce((x,y) => (10*x + y));
}

//console.log(getResult(['1', '2', '3']));

//在一个Array中，删掉偶数，只保留奇数
arr = [1, 2, 4, 5, 6, 9, 10, 15];
r = arr.filter(function (x) {
    return x % 2 !== 0;
});
r; // [1, 5, 9, 15]

arr = ['A', 'B', 'C'];
r = arr.filter(function (element, index, self) {
    console.log(element); // 依次打印'A', 'B', 'C'
    console.log(index); // 依次打印0, 1, 2
    console.log(self); // self就是变量arr
    return true;
});

//利用filter，可以巧妙地去除Array的重复元素
//去除重复元素依靠的是indexOf总是返回第一个元素的位置，
//后续的重复元素位置与indexOf返回的位置不相等，因此被filter滤掉了。
var
    r,
    arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];

    r = arr.filter(function (element, index, self) {
        return self.indexOf(element) === index;
    });

    //console.log(r.toString());
    
    //Array的sort()方法默认把所有元素先转换为String再排序
    //如果不知道sort()方法的默认排序规则，直接对数字排序，绝对栽进坑里！

    var data = [10, 20, 1, 2];
    //console.log(data.sort());//[1,10,2,20]

    arr.sort(function (x, y) {
        if (x < y) {
            return -1;
        }
        if (x > y) {
            return 1;
        }
        return 0;
    });
    //console.log(arr); // [1, 2, 10, 20]

    //闭包
    function lazy_sum(arr) {
        var sum = function () {
            return arr.reduce(function (x, y) {
                return x + y;
            });
        }
        return sum;
    }

    var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()

    //理论上讲，创建一个匿名函数并立刻执行可以这么写：
    var bb = (function (x) {
        return x * x;
    })(3); 
    console.log(bb);

    function count() {
        var arr = [];
        for (var i=1; i<=3; i++) {
            arr.push((function (n) {
                return n * n;
            })(i));
        }
        return arr;
    }

    var data = count();
    console.log(data);


    //创建一个计数器
    function create_counter(initial) {
        var x = initial || 0;
        return {
            inc: function () {
                x += 1;
                return x;
            }
        }
    }

    var c2 = create_counter(10);
    c2.inc(); // 11
    c2.inc(); // 12
    c2.inc(); // 13

    function make_pow(n) {
        return function (x) {
            return Math.pow(x, n);
        }
    }

    // 创建两个新函数:
var pow2 = make_pow(2);
var pow3 = make_pow(3);

console.log(pow2(5)); // 25
console.log(pow3(7)); // 343

// 两个参数:
(x, y) => x * x + y * y

// 无参数:
//() => 3.14

// 可变参数:
//(x, y, ...rest) => {
   // var i, sum = x + y;
    //for (i=0; i<rest.length; i++) {
       // sum += rest[i];
    //}
    //return sum;
//}

x => ({ foo: x })
var tinme = new Date().getTime();
var d = new Date(tinme);
console.log(d.toLocaleString());//2018-2-28 14:18:18
console.log(d.toUTCString());//Wed, 28 Feb 2018 06:19:03 GMT

var xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};

//对象序列化成JSON格式的字符串
var s = JSON.stringify(xiaoming);

//要输出得好看一些，可以加上参数，按缩进输出：
//第二个参数用于控制输出指定的属性
s = JSON.stringify(xiaoming, null, '  ');
s = JSON.stringify(xiaoming, ['name', 'skills'], '  ');

//还可以传入一个函数，这样对象的每个键值对都会被函数先处理：
function convert(key, value) {
    if (typeof value === 'string') {
        return value.toUpperCase();
    }
    return value;
}

s = JSON.stringify(xiaoming, convert, '  ');
console.log(s);

xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
    toJSON: function () {
        return { // 只输出name和age，并且改变了key：
            'Name': this.name,
            'Age': this.age
        };
    }
};

JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'

console.log(typeof JSON.parse('true') === 'boolean');


























